Podkwerend╣ jest instrukcja SELECT zagnie┐d┐ona wewn╣trz instrukcji SELECT, SELECT...INTO, INSERT...INTO, DELETE, lub UPDATE albo we wnΩtrzu innej podkwerendy.
W celu utworzenia podkwerendy mo┐na u┐yµ nastΩpuj╣cych trzech postaci sk│adni:
por≤wnanie [ANY | ALL | SOME] (instrukcja_sql)
wyra┐enie [NOT] IN (instrukcja_sql)
[NOT] EXISTS (instrukcja_sql)
Podkwerenda sk│ada siΩ z nastΩpuj╣cych element≤w:
Element | Opis |
---|---|
por≤wnanie | Wyra┐enie i operator por≤wnania por≤wnuj╣cy wyra┐enie z wynikiem podkwerendy. |
wyra┐enie | Wyra┐enie, kt≤rego warto£µ jest poszukiwana w zbiorze wynik≤w podkwerendy. |
instrukcja_sql | Instrukcja SELECT o takim samym formacie i spe│niaj╣ca te same regu│y, co ka┐da instrukcja SQL. Musi byµ ujΩta w nawiasy. |
Mo┐na u┐yµ podkwerendy zamiast wyra┐enia w li£cie p≤l instrukcji SELECT lub klauzuli WHERE czy HAVING. W podkwerendzie instrukcja SELECT s│u┐y to dostarczenia jednej lub wiΩcej warto£ci, kt≤re bior╣ udzia│ w obliczaniu wyra┐e± klauzul WHERE lub HAVING.
Predykaty ANY oraz SOME, bΩd╣ce synonimami, s│u┐╣ do pobierania rekord≤w w g│≤wnej kwerendzie, spe│niaj╣cych por≤wnanie z dowolnym rekordem pobranym przez podkwerendΩ. Poni┐szy przyk│ad zwraca wszystkie wyroby, kt≤rych cena jednostkowa jest wiΩksza ni┐ cena dowolnego innego wyrobu sprzedawanego z rabatem 25 procent lub wy┐szym:
SELECT * FROM Produkty
WHERE CenaJednostkowa > ANY
(SELECT CenaJednostkowa FROM OpisyZam≤wie±
WHERE Rabat >= .25);
Predykat ALL jest u┐ywany do pobierania tylko tych warto£ci z wyniku g│≤wnej kwerendy, kt≤re spe│niaj╣ por≤wnanie ze wszystkimi rekordami pobranymi przez podkwerendΩ. Je£li w poprzednim przyk│adzie zamienimy ANY na ALL, to kwerenda zwr≤ci tylko te produkty, kt≤rych cena jednostkowa jest wiΩksza ni┐ cena wszystkich produkt≤w sprzedawanych z rabatem 25 procent lub wy┐szym. Jest to o wiele ostrzejsze ograniczenie.
Predykat IN s│u┐y do pobierania w g│≤wnej kwerendzie tylko tych rekord≤w, dla kt≤rych w podkwerendzie istniej╣ rekordy zawieraj╣ce takie same warto£ci. Poni┐szy przyk│ad zwraca wszystkie produkty sprzedawane z rabatem 25 procent lub wy┐szym:
SELECT * FROM Produkty
WHERE NrProduktu IN
(SELECT NrProduktu_FROM OpisyZam≤wie±
WHERE Rabat >= .25);
I odwrotnie, mo┐na u┐yµ predykatu NOT IN do pobrania w g│≤wnej kwerendzie tylko tych rekord≤w, dla kt≤rych w podkwerendzie nie istniej╣ rekordy zawieraj╣ce takie same warto£ci.
Predykat EXISTS (z nieobowi╣zkowym s│owem zastrze┐onym NOT) jest u┐ywany w por≤wnaniach logicznych do okre£lenia, czy podkwerenda zwr≤ci│a jakiekolwiek rekordy.
Mo┐na tak┐e u┐yµ alias≤w nazw tabel w podkwerendzie, aby odwo│aµ siΩ do tabel wymienionych w klauzuli FROM na zewn╣trz podkwerendy. Poni┐szy przyk│ad zwraca nazwiska pracownik≤w, kt≤rych zarobki s╣ r≤wne lub wy┐sze od przeciΩtnych zarobk≤w wszystkich pracownik≤w na tym samym stanowisku. Tabela Pracownicy ma alias "T1".
SELECT Nazwisko,
ImiΩ, Stanowisko, Wynagrodzenie
FROM Pracownicy AS T1
WHERE Wynagrodzenie >=
(SELECT Avg(Wynagrodzenie)
FROM Pracownicy
WHERE T1.Stanowisko = Pracownicy.Stanowisko) Order by Stanowisko;
W powy┐szym przyk│adzie s│owo zastrze┐one AS jest nieobowi╣zkowe.
Niekt≤re podkwerendy s╣ dopuszczalne w kwerendzie krzy┐owej ù zw│aszcza jako predykaty (w klauzuli WHERE). Podkwerendy jako wynik (czyli te znajduj╣ce siΩ na li£cie SELECT) nie s╣ dozwolone w kwerendach krzy┐owych.